import turtle
import math
import time

# 初始化屏幕
screen = turtle.Screen()
screen.setup(800, 800)
screen.tracer(0)  # 关闭自动更新，手动控制动画更新

# 设置鳄鱼和人的初始位置
person = turtle.Turtle()
person.shape("circle")
person.color("blue")
person.penup()
person.setposition(0, 0)
person_speed = 15  # 调整人的速度
person_path = turtle.Turtle()
person_path.penup()
person_path.color("blue")
person_path.speed(0)

crocodile_speed = [25, 25, 25, 20]  # 调整鳄鱼的速度
crocodile_positions = [(-500, 500), (500, 500), (-500, -500), (500, -500)]  # 鳄鱼的初始位置
crocodiles = []  # 创建鳄鱼列表
crocodile_paths = []

# 创建鳄鱼
for i, pos in enumerate(crocodile_positions):
    croc = turtle.Turtle()
    croc.shape("turtle")
    croc.color("green")
    croc.penup()
    croc.setposition(pos)
    croc.speed(0)
    croc.speed_factor = crocodile_speed[i]
    crocodiles.append(croc)  # 将鳄鱼加入到列表中

    # 创建鳄鱼轨迹
    path = turtle.Turtle()
    path.penup()
    path.color("green")
    path.speed(0)
    crocodile_paths.append(path)


# 计算距离
def distance(x1, y1, x2, y2):
    return math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)


# 让人朝最优方向运动（考虑到所有鳄鱼）
def move_person():
    best_distance = float('-inf')
    best_direction = person.heading()  # 默认方向
    person_position = person.position()

    # 计算人每次移动前，选择最远的方向
    for angle in range(0, 360, 10):  # 每10度检查一个方向
        person.setheading(angle)
        new_x = person_position[0] + person_speed * math.cos(math.radians(angle))
        new_y = person_position[1] + person_speed * math.sin(math.radians(angle))

        # 计算新位置与所有鳄鱼的距离
        min_dist = min([distance(new_x, new_y, croc.xcor(), croc.ycor()) for croc in crocodiles])
        # 如果这一步人能够最大化与鳄鱼的最小距离，选择这个方向
        if min_dist > best_distance:
            best_distance = min_dist
            best_direction = angle

    # 计算人类移动的距离
    new_x = person_position[0] + person_speed * math.cos(math.radians(best_direction))
    new_y = person_position[1] + person_speed * math.sin(math.radians(best_direction))
    person.setposition(new_x, new_y)

    # 画出人运动轨迹
    person_path.setposition(person_position)
    person_path.pendown()
    person_path.setposition(new_x, new_y)

    # 返回人类的移动距离
    return distance(person_position[0], person_position[1], new_x, new_y)


# 更新鳄鱼位置
def move_crocodiles():
    min_time = float('inf')  # 用来记录最短时间
    for croc, path in zip(crocodiles, crocodile_paths):  # 遍历所有鳄鱼
        x, y = croc.position()
        target_x, target_y = person.position()

        # 计算鳄鱼到达目标方向的距离
        dist = distance(x, y, target_x, target_y)
        move_distance = min(dist, croc.speed_factor)  # 取最小值，防止超速

        # 每次更新时，确保鳄鱼朝向人的位置
        croc.setheading(croc.towards(person))  # 使鳄鱼朝向人的位置

        # 计算新的位置
        angle = croc.heading()  # 鳄鱼的朝向
        new_x = x + move_distance * math.cos(math.radians(angle))
        new_y = y + move_distance * math.sin(math.radians(angle))

        croc.setposition(new_x, new_y)

        # 画出鳄鱼的运动轨迹
        path.setposition(x, y)
        path.pendown()
        path.setposition(new_x, new_y)

        # 判断鳄鱼是否到达人的位置
        if dist <= croc.speed_factor:  # 如果距离小于或等于速度，表示鳄鱼追上了人
            return dist / croc.speed_factor  # 返回追逐的时间

    return float('inf')


# 显示时间
def display_time(elapsed_time):
    display = turtle.Turtle()
    display.penup()
    display.hideturtle()
    display.goto(0, -350)
    display.write(f"存活时间：{elapsed_time:.2f} 秒", align="center", font=("Arial", 16, "normal"))


# 模拟追逐过程
start_time = time.time()  # 开始时间
time_elapsed = 0  # 用来记录时间
person_travelled_distance = 0  # 人类已移动的总距离

# 追逐模拟过程
while True:
    # 让人运动，并记录每次移动的距离
    person_travelled_distance += move_person()  # 累加人类的移动距离
    min_time = move_crocodiles()  # 更新鳄鱼的位置并计算最短时间
    time_elapsed = time.time() - start_time  # 计算经过的时间

    # 如果最短时间已经确定，就显示并停止模拟
    if min_time != float('inf'):
        # 计算存活时间：存活时间 = 人类的总移动距离 / 人类的速度
        survival_time = person_travelled_distance / person_speed
        display_time(survival_time)  # 显示实际的存活时间
        break

    screen.update()
    time.sleep(0.04)  # 调整延时，减慢动画速度

# 保持屏幕打开，直到用户关闭
turtle.done()
